#include <clock.h>
#include <kernel.h>
#include <interrupt.h>
#include <printk.h>
#include <process.h>

void clock_half_handler();


/*  系统节拍： jiffes    
 *  最大值:    4294967295 / 1000 = 4294967.295s
 *  ~~  49.71026963天
 */
static jiffes_t jiffes = 0;
/************************************************
 *  timer
 ************************************************/
static jiffes_t timer_sp;
void _default_set_timer()
{
    timer_sp = get_ticks();
}
jiffes_t _default_get_time()
{
    return get_ticks() - timer_sp;
}
void default_timer_init()
{
    default_timer.set_timer = _default_set_timer;
    default_timer.get_time = _default_get_time;
}
/************************************************
 *  clock
 ************************************************/
int clock_irq_handler(int irq)                          /*   时钟中断处理函数   */
{
    ++jiffes;
    clock_half_handler();
}

void clock_half_handler()
{
    if(jiffes % 100 == 0){
        switch_to();                                    /*   进程切换   */
    }
}

inline uint32_t get_ticks()
{
    return jiffes;
}

void sleep(uint32_t t)
{
    jiffes_t tp = jiffes;
    while (jiffes_to_s(jiffes - tp) < t);
}

void clock_init(void)
{
    register_irq(CLOCK_IRQ, clock_irq_handler);
    default_timer_init();
}
